// 包声明，定义了类所在的包
package com.example.emos.wx.config.shiro;

// 导入相关类
import cn.hutool.core.date.DateField;
import cn.hutool.core.date.DateUtil;
import com.auth0.jwt.JWT;
import com.auth0.jwt.JWTCreator;
import com.auth0.jwt.JWTVerifier;
import com.auth0.jwt.algorithms.Algorithm;
import com.auth0.jwt.interfaces.DecodedJWT;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;

import java.util.Date;

// 声明为 Spring 组件，交由 Spring 管理
@Component
// 使用 Lombok 自动生成日志变量
@Slf4j
// 类的定义
public class JwtUtil {

    // 从配置文件中读取密钥
    @Value("${emos.jwt.secret}")
    private String secret;

    // 从配置文件中读取 Token 过期时间
    @Value("${emos.jwt.expire}")
    private int expire;

    // 创建 Token 的方法
    public String createToken(int userId) {
        // 计算过期时间为当前时间加上指定天数
        Date date = DateUtil.offset(new Date(), DateField.DAY_OF_YEAR, 5);
        // 使用 HMAC256 算法和密钥创建算法对象
        Algorithm algorithm = Algorithm.HMAC256(secret);
        // 创建 JWT 构建器
        JWTCreator.Builder builder = JWT.create();
        // 添加用户 ID 和过期时间到 Token 中，并进行签名
        String token = builder.withClaim("userId", userId)
                .withExpiresAt(date)
                .sign(algorithm);
        // 返回生成的 Token
        return token;
    }

    // 解析 Token 获取用户 ID 的方法
    public int getUserId(String token) {
        // 解码 Token
        DecodedJWT jwt = JWT.decode(token);
        // 从 Token 中获取用户 ID
        int userId = jwt.getClaim("userId").asInt();
        // 返回用户 ID
        return userId;
    }

    // 验证 Token 的方法
    public void verifierToken(String token) {
        // 使用 HMAC256 算法和密钥创建算法对象
        Algorithm algorithm = Algorithm.HMAC256(secret);
        // 创建 JWT 验证器
        JWTVerifier verifier = JWT.require(algorithm).build();
        // 验证 Token
        verifier.verify(token);
    }
}
